import { useUserStore } from '~/store/useUser'

/**
 * 认证守卫工具类
 * 提供页面级别的认证检查和权限验证
 */

export interface AuthGuardOptions {
  requireAuth?: boolean // 是否需要登录
  requireUserType?: 'buyer' | 'seller' // 需要的用户类型
  requireCompany?: boolean // 是否需要公司信息
  redirectTo?: string // 自定义重定向路径
  message?: string // 自定义提示消息
}

/**
 * 页面认证守卫
 * 在页面组件中使用，检查用户权限
 * @param options 认证选项
 * @returns Promise<boolean> 是否通过认证
 */
export const pageAuthGuard = async (options: AuthGuardOptions = {}): Promise<boolean> => {
  const {
    requireAuth = true,
    requireUserType,
    requireCompany = false,
    redirectTo = '/login',
    message
  } = options

  const userStore = useUserStore()
  const router = useRouter()

  // 检查是否需要登录
  if (requireAuth && !userStore.isLogin) {
    ElMessage.warning(message || '请先登录')
    await router.push(redirectTo)
    return false
  }

  // 如果需要登录但没有用户信息，尝试获取
  if (requireAuth && userStore.isLogin && (!userStore.getUserInfo || Object.keys(userStore.getUserInfo).length === 0)) {
    try {
      await userStore.userInfoAction()
    } catch (error) {
      console.error('获取用户信息失败:', error)
      ElMessage.error('登录状态已过期，请重新登录')
      await router.push('/login')
      return false
    }
  }

  // 检查用户类型
  // 角色判断已关闭
  // if (requireUserType) {
  //   const userInfo = userStore.getUserInfo
  //   if (userInfo?.userType !== requireUserType) {
  //     const typeMessage = requireUserType === 'seller' ? '此功能仅限卖家使用' : '此功能仅限买家使用'
  //     ElMessage.warning(message || typeMessage)
  //     await router.push('/')
  //     return false
  //   }
  // }

  // 检查公司信息
  if (requireCompany) {
    const userInfo = userStore.getUserInfo
    if (!userInfo?.companyId || !userInfo?.companyName) {
      ElMessage.warning(message || '请先完善公司信息')
      await router.push('/setUp')
      return false
    }
  }

  return true
}

/**
 * 操作认证守卫
 * 在执行特定操作前检查权限
 * @param options 认证选项
 * @returns boolean 是否通过认证
 */
export const actionAuthGuard = (options: AuthGuardOptions = {}): boolean => {
  const {
    requireAuth = true,
    requireUserType,
    requireCompany = false,
    message
  } = options

  const userStore = useUserStore()
  const router = useRouter()

  // 检查是否需要登录
  if (requireAuth && !userStore.isLogin) {
    ElMessage.warning(message || '请先登录')
    router.push('/login')
    return false
  }

  // 检查用户类型
  // 角色判断已关闭
  // if (requireUserType) {
  //   const userInfo = userStore.getUserInfo
  //   if (userInfo?.userType !== requireUserType) {
  //     const typeMessage = requireUserType === 'seller' ? '此功能仅限卖家使用' : '此功能仅限买家使用'
  //     ElMessage.warning(message || typeMessage)
  //     return false
  //   }
  // }

  // 检查公司信息
  if (requireCompany) {
    const userInfo = userStore.getUserInfo
    if (!userInfo?.companyId || !userInfo?.companyName) {
      ElMessage.warning(message || '请先完善公司信息')
      router.push('/setUp')
      return false
    }
  }

  return true
}

/**
 * 创建需要认证的页面组合式函数
 * @param options 认证选项
 * @returns 认证状态和相关方法
 */
export const useAuthGuard = (options: AuthGuardOptions = {}) => {
  const isAuthenticated = ref(false)
  const isLoading = ref(true)
  const userStore = useUserStore()

  const checkAuth = async () => {
    isLoading.value = true
    try {
      const result = await pageAuthGuard(options)
      isAuthenticated.value = result
      return result
    } finally {
      isLoading.value = false
    }
  }

  // 在组件挂载时检查认证
  onMounted(async () => {
    await checkAuth()
  })

  return {
    isAuthenticated: readonly(isAuthenticated),
    isLoading: readonly(isLoading),
    checkAuth,
    userInfo: computed(() => userStore.getUserInfo),
    isLogin: computed(() => userStore.isLogin)
  }
}

/**
 * 路由守卫辅助函数
 * 用于在路由导航守卫中使用
 */
export const routeAuthGuard = {
  /**
   * 检查路由是否需要认证
   * @param to 目标路由
   * @returns boolean
   */
  requiresAuth(to: any): boolean {
    return to.meta?.requiresAuth !== false
  },

  /**
   * 检查路由是否需要特定用户类型
   * @param to 目标路由
   * @returns string | undefined
   */
  getRequiredUserType(to: any): string | undefined {
    return to.meta?.requireUserType
  },

  /**
   * 检查路由是否需要公司信息
   * @param to 目标路由
   * @returns boolean
   */
  requiresCompany(to: any): boolean {
    return to.meta?.requireCompany === true
  }
}

/**
 * 页面认证装饰器
 * 用于Vue组件的setup函数中
 */
export const withAuth = (options: AuthGuardOptions = {}) => {
  return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {
    const originalMethod = descriptor.value
    
    descriptor.value = async function (...args: any[]) {
      const isAuthorized = await pageAuthGuard(options)
      if (isAuthorized) {
        return originalMethod.apply(this, args)
      }
    }
    
    return descriptor
  }
}